package edu.upc.clase.demo.dao.impl;

import edu.upc.clase.demo.dao.PersonaDao;
import edu.upc.clase.demo.entity.Persona;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;
import org.springframework.stereotype.Repository;

/**
 *
 * @author evelyn
 */


@Repository
public class PersonaDaoImpl extends SimpleJdbcDaoSupport implements PersonaDao{
    
    private static Logger log = LoggerFactory.getLogger(PersonaDaoImpl.class);

    @Autowired
    public PersonaDaoImpl(DataSource dataSource) {
        log.info("Asignando el dataSource");
        setDataSource(dataSource);
    
}

    @Override
    public Integer insertar(Persona persona) {
        getJdbcTemplate().update(
                "insert into Persona (nickname,correo,password,nombres,apellido_mat,apellido_pat,sexo,dni,fecha_nacimiento,direccion,movil,estado_usuario,id_rol,alta_registro,baja_registro,ultima_modificacion,website,cuenta_bancaria,nombre_banco,descrip_persona) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
                persona.getNickname(), persona.getCorreo(),
                persona.getPassword(), persona.getNombres(), persona.getApellido_mat(),
                persona.getApellido_pat(), persona.getSexo(), persona.getDni(), 
                persona.getF_nacimiento(), persona.getDireccion(), persona.getMovil(), 
                persona.getEstado_usuario(), persona.getId_rol(), persona.getAlta_registro(),
                persona.getBaja_registro(), persona.getUltima_modificacion(), persona.getWebsite(), 
                persona.getCuenta_bancaria(), persona.getNombre_banco(), persona.getDescrip_persona());
        return getSimpleJdbcTemplate().queryForInt("select last_insert_id()");
    }

    @Override
    public void actualizar(Persona persona) {
        getJdbcTemplate().update(
                "update Persona set correo = ?, password = ?, nombres = ?, apellido_pat = ?, apellido_mat = ?, sexo = ?, dni = ?, fecha_nacimiento = ?, direccion = ?, movil = ?, estado_usuario = ?, id_rol = ?, alta_registro = ?, baja_registro = ?, ultima_modificacion = ?, website = ?, cuenta_bancaria = ?, nombre_banco = ?, descrip_persona = ?  where Id_persona = ? ",
                persona.getCorreo(), persona.getPassword(), persona.getNombres(),
                persona.getApellido_mat(), persona.getApellido_pat(), persona.getSexo(), 
                persona.getDni(), persona.getF_nacimiento(), persona.getDireccion(), 
                persona.getMovil(), persona.getEstado_usuario(), persona.getId_rol(), 
                persona.getAlta_registro(), persona.getBaja_registro(), persona.getUltima_modificacion(), 
                persona.getWebsite(), persona.getCuenta_bancaria(), persona.getNombre_banco(), 
                persona.getDescrip_persona());
    }

    @Override
    public void eliminar(Persona persona) {
        getJdbcTemplate().update(                
                "delete from Persona where id = ?", persona.getId_persona());
    }

    @Override
    public List<Persona> buscarTodos() {
        return getSimpleJdbcTemplate().query(
                "select Id_persona, nickname, correo, password, nombres, apellido_mat, apellido_pat from Persona", 
                new BeanPropertyRowMapper<Persona>(Persona.class));
    }

    @Override
    public Persona buscar(Integer id) {
        
        try {
            return getSimpleJdbcTemplate().queryForObject(
                    "select Id_persona, nickname, correo, password from Persona where Id_persona=?", 
                    new BeanPropertyRowMapper<Persona>(Persona.class), id);
            
        } catch (EmptyResultDataAccessException e) {
            log.error(e.getMessage(),e);
            return null;
        }
    }

    @Override
    public Persona buscar(String correo) {
        try {
            return getSimpleJdbcTemplate().queryForObject(
                    "select Id_persona, nickname, correo, password from Persona where correo=?",
                    new BeanPropertyRowMapper<Persona>(Persona.class), correo);
            
        } catch (EmptyResultDataAccessException e) {
            log.error(e.getMessage(),e);
            return null;
        }
    }

    @Override
    public List<Persona> buscarPorNombre(String nombre) {
        try {
            Map<String,String> parametros = new HashMap<String,String>();
            parametros.put("nombres","%"+nombre+"%");
            return getSimpleJdbcTemplate().query(
                    "select * from Persona where nombres like :nombre",
                    new BeanPropertyRowMapper<Persona>(Persona.class),parametros);
        } catch (EmptyResultDataAccessException e) {
            return null;
        }
    }
}